import dayjs from "dayjs";
import { getItem } from "./localStorage";
import { getToken } from "./auth";
import env from "./env";

// 创建订单编号
export const orderNumber = () => {
  // 当前时间戳
  const timeStamp = Date.now();
  // 年
  const year = dayjs(timeStamp).format("YYYY");
  // 月
  const moon = dayjs(timeStamp).format("MM");
  // 日
  const day = dayjs(timeStamp).format("DD");
  // 随机数（1~9）
  const randomNum = Math.ceil(Math.random() * (9 - 0) + 0);

  // 返回结果
  return `${year}${moon}${day}${timeStamp}${randomNum}`;
};

// 消息弹框
// 为何要封装（uni不是提供好了吗？因为每次都要填写icon图标，配置麻烦）
export const alert = (title, duration = 1000) => {
  uni.showToast({
    icon: "none",
    title,
    duration,
  });
};

// 返回唯一的id
export const uuid = () => {
  return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, function (c) {
    var r = (Math.random() * 16) | 0,
      v = c == "x" ? r : (r & 0x3) | 0x8;
    return v.toString(16);
  });
};

// 返回多少时间前
export const timeInterval = (timesData) => {
  //如果时间格式是正确的，那下面这一步转化时间格式就可以不用了
  var dateBegin = timesData; //将-转化为/，使用new Date
  var dateEnd = new Date(); //获取当前时间
  var dateDiff = Math.abs(dateEnd.getTime() - dateBegin); //时间差的毫秒数
  var yearDiff = Math.floor(dateDiff / (24 * 3600 * 1000 * 365));
  var dayDiff = Math.floor(dateDiff / (24 * 3600 * 1000)); //计算出相差天数
  var leave1 = dateDiff % (24 * 3600 * 1000); //计算天数后剩余的毫秒数
  var hours = Math.floor(leave1 / (3600 * 1000)); //计算出小时数
  //计算相差分钟数
  var leave2 = leave1 % (3600 * 1000); //计算小时数后剩余的毫秒数
  var minutes = Math.floor(leave2 / (60 * 1000)); //计算相差分钟数
  //计算相差秒数
  var leave3 = leave2 % (60 * 1000); //计算分钟数后剩余的毫秒数
  var seconds = Math.round(leave3 / 1000);
  var timesString = "";
  if (yearDiff != 0) {
    timesString = yearDiff + "年前";
  } else if (yearDiff == 0 && dayDiff != 0) {
    timesString = dayDiff + "天前";
  } else if (dayDiff == 0 && hours != 0) {
    timesString = hours + "小时前";
  } else if (hours == 0 && minutes != 0) {
    timesString = minutes + "分钟前";
  } else if (minutes == 0 && seconds < 60) {
    timesString = "刚刚";
  }
  return timesString;
};

// 时间戳转日期
export const parseTime = (time, pattern) => {
  if (arguments.length === 0 || !time) {
    return null;
  }
  const format = pattern || "{y}-{m}-{d} {h}:{i}:{s}";
  let date;
  if (typeof time === "object") {
    date = time;
  } else {
    if (typeof time === "string" && /^[0-9]+$/.test(time)) {
      time = parseInt(time);
    } else if (typeof time === "string") {
      time = time
        .replace(new RegExp(/-/gm), "/")
        .replace("T", " ")
        .replace(new RegExp(/\.[\d]{3}/gm), "");
    }
    if (typeof time === "number" && time.toString().length === 10) {
      time = time * 1000;
    }
    date = new Date(time);
  }
  const formatObj = {
    y: date.getFullYear(),
    m: date.getMonth() + 1,
    d: date.getDate(),
    h: date.getHours(),
    i: date.getMinutes(),
    s: date.getSeconds(),
    a: date.getDay(),
  };
  const time_str = format.replace(/{(y|m|d|h|i|s|a)+}/g, (result, key) => {
    let value = formatObj[key];
    // Note: getDay() returns 0 on Sunday
    if (key === "a") {
      return ["日", "一", "二", "三", "四", "五", "六"][value];
    }
    if (result.length > 0 && value < 10) {
      value = "0" + value;
    }
    return value || 0;
  });
  return time_str;
};

// 中文正则（必须为中文）
export const chineseReg = (chinese) => {
  // 中文正则
  const reg = /^([\u4E00-\u9FA5])*$/;
  return reg.test(chinese);
};

// 手机号正则
export const phoneReg = (phone) => {
  const reg = /^1[3|4|5|6|7|8|9]\d{9}$/;
  return reg.test(phone);
};

// 邮箱正则
export const emailReg = (email) => {
  // const reg =
  //   /^(([^<>()[\]\\.,;:\s@"]+(\.[^<>()[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;
  const reg = /^([A-Za-z0-9_\-\.])+\@([A-Za-z0-9_\-\.])+\.([A-Za-z]{2,4})$/;
  return reg.test(email);
};

// alert弹框
// 为什么封装？因为默认需要写过多的配置项才可以达成效果，这里做一封装
// 由于alert是window上的一个方法所以这里用大写A代替a
export const Alert = (title, icon = "none", duration = 1500, mask = false) => {
  let duration_ = duration != 0 ? 1500 : 600000;

  // console.log("duration____", duration_);

  uni.showToast({
    title, // 弹框标题
    icon, // icon图标（默认为none）
    duration: duration_, // 执行多少秒（默认1500ms）
    mask, // 是否显示透明蒙层，防止触摸穿透，默认：false
  });
};

// 隐藏消息提示框
export const unAlert = () => {
  uni.hideToast();
};

// 格式化（男/女）  后台需要的数据说明：0: 不限   1: 男    2: 女
// 文字转数字
export const formatSex = (sexKey) => {
  // 方式一：
  // if (sexKey == '不限') {
  //   return 0
  // } else if (sexKey == '男') {
  //   return 1
  // } else if (sexKey == '女') {
  //   return 2
  // }

  // 方式二：
  return sexKey == "不限制" ? 0 : sexKey == "男" ? 1 : 2;
};

// 数字转文字
export const formatSex_ = (sexKey) => {
  return sexKey == 0 ? "不限制" : sexKey == 1 ? "男" : "女";
};

// 快递盒子大小
/**
 *  -1: 小
 *  0: 中
 *  1: 大
 * */
export const boxSize = (size) => {
  // return ['小件', '中件', '大件'][size]
  return size === -1 ? "小件" : size === 0 ? "中件" : "大件";
};

// 这是客户端传给服务器的数据：http://ghjy48.natappfree.cc/avatar/2023-7-26^1690351751150.jpg（需要2023-7-26^1690351751150.jpg）
// 这样的数据是不可以写入数据库的（这里前端不做就要后端做，后端不做前端就要做，哈哈哈）
export const formatAvatar = (avatar) => {
  return (avatar =
    avatar.indexOf("avatar") >= 0
      ? avatar.substring(avatar.indexOf("avatar") + "avatar".length + 1)
      : avatar);
};

// 后台返回的数据2023-7-26^1690351751150.jpg   //转换https://www.zxycode.cloud/avatar/2023-9-9^1694220725971.jpg
export const formatAvatar_http = (avatarUrl) => {
  return env.uploadImage + "/avatar/" + avatarUrl;
};

// 判断用户是否登录（如果没有则有的按钮不能点或要隐藏）
// type意思：如果该按钮还需要申请接单后才可以已使用就要传该参数，传yes，默认no  不需要接单申请也可以进入下一步
export const isLogin = (type) => {
  // 1. 获取用户登录状态
  const token = getToken();

  // console.log("tool中打印type：", type);

  const userInfo = getItem("userInfo");

  if (userInfo.campus == "null") {
    Alert("请先设置本人所在校区", "none", 1000, true);

    setTimeout(() => {
      uni.navigateTo({
        url: "/pagesA/personalCenter/index",
      });
    }, 1000);

    return "error";
  }

  if (type == "yes") {
    if (!token) {
      // 当前路由不需要申请接单
      // 没有登录
      uni.showModal({
        title: "提示",
        content: "请先登录",
        confirmText: "去登录",
        success: function (res) {
          if (res.confirm) {
            // console.log("用户点击确定");
            uni.navigateTo({
              url: "/pagesA/oneClickLogin/index",
            });
          } else if (res.cancel) {
            // console.log("用户点击取消");
            // uni.navigateBack();
          }
        },
      });

      return "error";
    } else {
      // 需要申请接单才可以进入
      if (getItem("userInfo").authType == 0) {
        // 资料审核中
        if (getItem("userInfo").studentIsApply == 1) {
          uni.showModal({
            title: "提示",
            content: "资料审核中",
            showCancel: false,
          });
          return "error";
        }
        // 当前账号没有权限进入（为1才可以）
        uni.showModal({
          title: "提示",
          content: "请先申请接单",
          confirmText: "去申请",
          success: function (res) {
            if (res.confirm) {
              uni.navigateTo({
                url: "/pagesA/applyOrder/index",
              });
            }
          },
        });
        return "error";
      }
    }

    return "ok";
  } else {
    // 登陆了
    return "ok";
  }
};

// 获取一个结果：当前时间早上|上午|下午|晚上
export const timeStatus = () => {
  let message = "";

  let hours = new Date().getHours();

  if (hours <= 9) {
    message = "早上好";
  } else if (hours < 12) {
    message = "上午好";
  } else if (hours < 18) {
    message = "下午好";
  } else {
    message = "晚上好";
  }

  return message;
};

// 终点报时（引文版）
export const timeStatusEnglish = () => {
  let message = "";

  let hours = new Date().getHours();

  if (hours < 12) {
    message = "Good morning";
  } else if (hours < 18) {
    message = "Good afternoon";
  } else if (hours < 24) {
    message = "Good afternoon";
  } else {
    message = "Hello";
  }

  return message;
};

/**
都一样返回true，反之
示例
  isAllElementsSame([200, 200, 200])    // true
  isAllElementsSame([200, 300, 200])    // false
*/
export const isAllElementsSame = (arr) => {
  const firstElement = arr[0];

  // 检查所有元素是否与第一个元素相同
  return arr.every((element) => element === firstElement);
};

// 预览图片（1张）
export const previewImage = (url) => {
  uni.previewImage({
    urls: Array(url),
    success(res) {
      // console.log("res：", res);
    },
  });
};
// 预览图片（2张及以上）
export const previewImageList = (urlList) => {
  uni.previewImage({
    urls: urlList,
    success(res) {
      // console.log("res：", res);
    },
  });
};

// 拨打电话
export const makePhoneCall = (phoneNumber) => {
  uni.makePhoneCall({
    phoneNumber,
    complete(res) {
      console.log(res);
    },
  });
};

// 跳转页面
export const jumpPage = (page) => {
  uni.navigateTo({
    url: page,
  });
};

// 随机数
export const getRandomBumber = (min, max) => {
  return Math.round(Math.random() * (max - min) + min);
};

// 激励语录
export const encourage = () => {
  const list = [
    "自强志在心，创业践于行。",
    "苔花如米小，亦学牡丹开。",
    "拔毛能济世，端为谢杨朱。",
    "月缺不改光，剑折不改刚。",
    "审天地之道，察众人之心。",
    "不惧未来，做更好的自己。",
    "千丈之堤，以蝼蚁之穴溃。",
    "学他人知识，变自已财富。",
    "奋斗就是，每一天都很难。",
    "天上落金子，也要起得早。",
    "十艺半懂，不如一艺精通。",
    "今天也是自律的一天呦！",
  ];

  const randomNum = getRandomBumber(0, list.length - 1);

  return list[randomNum];
};

// 0：女  1：男
export const formatGender = (status) => {
  return status == 0 ? "女" : status == 1 ? "男" : "error";
};

// 格式化图片路径
export const formatingAvatar = (avatar) => {
  if (!avatar) {
    return `./../static/default_avatar.png`;
  }

  return `${env.baseUrl}/studio/img/head/${avatar}`;
};
